package leetcode.cn;

/**
 * @version 1.8
 * @Author Djx_hmbb
 * @Date 2023/11/15 8:49
 * @注释:1004.最大连续1的个数 III
 */
public class LongestOnes {
    /*给定一个二进制数组 nums 和一个整数 k，如果可以翻转最多 k 个 0 ，则返回 数组中连续 1 的最大个数
示例 1：
输入：nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2
输出：6
解释：[1,1,1,0,0,1,1,1,1,1,1]
粗体数字从 0 翻转到 1，最长的子数组长度为 6。

示例 2：
输入：nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
输出：10
解释：[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
粗体数字从 0 翻转到 1，最长的子数组长度为 10。*/


    //自己写的--47/55
    public static int longestOnes1(int[] nums, int k) {
        //1. 先扩窗口（进窗口）
        int n = nums.length, kk = k;
        int right = 0, left = 0, len = 0;
        while (right < n) {
            //2. 判断（[r]是否为0）
            //为0，则k--；否则r++
            //3. 当k=0 && [r]==0时，记录长度
            if (kk != 0 && nums[right] == 0) {
                kk--;
                right++;
            } else if (nums[right] == 0) {
                len = Math.max(len, right - left);
                //4. 出窗口
                // 5. 判断[l]是否为0。为0，则取下一位数。r=l，再进窗口。
                while (left < n) {
                    if (nums[left] == 0) {
                        left++;
                        break;
                    }
                    left++;
                }
                right = left;
                kk = k;
            } else if (right == n - 1 && nums[right] == 1) {
                len = Math.max(len, right - left + 1);
                right++;
            } else if (nums[right] == 1) {
                right++;
            }
        }
        return len;
    }

    //老师的代码while版本
    public static int longestOnes2(int[] nums, int k) {
        int n = nums.length, kk = k, left = 0, right = 0, len = 0;
        while (right < n) {
            //先进窗口
            if (nums[right] == 0) {
                kk--;
                right++;
            }
            else right++;
            //判断kk的值
            while (kk < 0) {
                if (nums[left++] == 0) kk++;
            }
            //计算长度
            len = Math.max(len, right - left);
        }
        return len;
    }

    //老师的代码fori版本
    public static int longestOnes3(int[] nums, int k){
        int ret = 0;
        for(int left = 0,right = 0,zero = 0;right<nums.length;right++){
            if(nums[right] == 0) zero++;
            while(zero>k){
                if(nums[left++]==0) zero--;
            }
            ret = Math.max(ret,right-left+1);
        }
        return ret;
    }

    public static void main(String[] args) {
        int[] nums = {0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1};
        int k = 3;
        int i = longestOnes2(nums, k);
        System.out.println(i);
    }
}
